package self.Lunastic.HexaSweeper.Base;

/**
 * 管理渐变过程
 */
public class GradientFunction {
    private interface OperationFunction<T> { T result(T x); }
    private static <T> T OperationFunction(T n, OperationFunction<T> fn){ return fn.result(n);}
    /**
     * 从0->1的自定义过度方式
     * @param n 自变量 其中小于0以及大于1部分会强制为0或者1
     * @param fn 自定义函数 用于自定义过度方式
     * @return 因变量 0~1
     */
    public static double gradient(double n, OperationFunction<Double> fn){
        if (n < 0.0) return 0.0;
        if (n > 1.0) return 1.0;
        return OperationFunction(n, fn);
    }

    /**
     * 从 start -> end 过度方式
     * @param fn 自定义函数 用于自定义过度方式
     * @param n 自变量 0 其中小于0以及大于1部分会强制为0或者1
     * @param start 过度起始值
     * @param end 过度结束值
     * @return 因变量
     */
    public static int gradient(double n, OperationFunction<Double> fn, int start, int end){
        return (int) (gradient(n, fn) * (end - start) + start);
    }

    // 预设过度模式
    public static double linear(double n){ return gradient(n, x -> x); }
    public static int linear(double n, int s, int e){ return gradient(n, x -> x, s, e); }
}